home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyStandardGetFolder.p < prev    next >
Encoding:
Text File  |  1997-01-06  |  4.8 KB  |  142 lines  |  [TEXT/CWIE]

  1. unit MyStandardGetFolder;
  2.  
  3. interface
  4.  
  5.     uses
  6.         StandardFile;
  7.  
  8.     procedure StandardGetFolder (where: Point; message: Str255; var mySFReply: StandardFileReply);
  9. {     Upon return, the sfFile field of the SFReply record contains the volume  }
  10. {     reference number and directory ID that specify the folder the user       }
  11. {     chose. It also passes back the name of the chosen folder.  The sfGood    }
  12. {     field is set to true if the user chose a folder, or false if not.        }
  13.  
  14. implementation
  15.  
  16.     uses
  17.         TextUtils, Aliases, Script, MyStrings, MyFileSystemUtils, MyDialogs;
  18.  
  19.     const
  20.         rGetFolderButton = 10;
  21.         rGetFolderMessage = 11;
  22.         rGetFolderSelectString = 12;
  23.         kFolderBit = $0010;
  24.         rGetFolderDialog = 2008;
  25.  
  26.     type
  27.         StandardFileReplyPtr = ^StandardFileReply;
  28.  
  29.     var
  30.         gCurrentSelectedFolder: Str255;
  31.  
  32.     function MyCustomGetDirectoryFileFilter (pb: CInfoPBPtr; ignored: Ptr): boolean;
  33.     begin
  34. {$unused(ignored)}
  35.         MyCustomGetDirectoryFileFilter := BAND(pb^.ioFlAttrib, kFolderBit) = 0;
  36.     end;
  37.  
  38.     function MyCustomGetDirectoryDlogHook (item: integer; theDialog: DialogPtr; mySFRPtr: StandardFileReplyPtr): integer;
  39.  
  40.         procedure SetButtonTitle (name: Str255);
  41.             var
  42.                 resultCode: integer;
  43.                 width: integer;
  44.                 template, s: Str255;
  45.                 itemRect: Rect;
  46.         begin
  47.             if gCurrentSelectedFolder <> name then begin
  48.                 gCurrentSelectedFolder := name;
  49.                 GetItemText(theDialog, rGetFolderSelectString, template); { "Select “^1”" template }
  50.                 GetDItemRect(theDialog, rGetFolderButton, itemRect);
  51.                 SPrintS3 (s,template,'','','');
  52.                 width := (itemRect.right - itemRect.left) - StringWidth(s);
  53.                 resultCode := TruncString(width, name, smTruncEnd);
  54.                 SPrintS3 (s,template,name,'','');
  55.                 SetDCtlTitle(theDialog, rGetFolderButton, s);
  56.                 ValidRect(itemRect);
  57.             end;
  58.         end;
  59.  
  60.         procedure SetFolderButtonTitle (vrn: integer; dirID: longint);
  61.             var
  62.                 name: Str63;
  63.                 pb: CInfoPBRec;
  64.                 oe: OSErr;
  65.         begin
  66.             oe := MyGetCatInfo(vrn, dirID, name, -1, pb);
  67.             if oe = noErr then begin
  68.                 SetButtonTitle(name);
  69.             end;
  70.         end;
  71.  
  72.         var
  73.             wrefcon:longint;
  74.     begin
  75.         wrefcon:=GetWRefCon(theDialog);
  76.         if OSType(wrefcon) = sfMainDialogRefCon then begin
  77.             if item = sfHookFirstCall then begin
  78.                 SetItemText(theDialog, rGetFolderMessage, gCurrentSelectedFolder);
  79.                 gCurrentSelectedFolder := '';
  80.             end else begin
  81.                 if mySFRPtr^.sfFile.name = '' then begin
  82.                     GetSFLocation(mySFRPtr^.sfFile.vRefNum, mySFRPtr^.sfFile.parID); { these aren't always set properly }
  83.                     SetFolderButtonTitle(mySFRPtr^.sfFile.vRefNum, mySFRPtr^.sfFile.parID);
  84.                 end else begin
  85.                     SetButtonTitle(mySFRPtr^.sfFile.name);
  86.                 end;
  87.             end;
  88.  
  89.             if item = rGetFolderButton then begin
  90.                 item := sfItemCancelButton;
  91.                 mySFRPtr^.sfGood := true;
  92.             end;
  93.  
  94.         end;
  95.         MyCustomGetDirectoryDlogHook := item;
  96.     end;
  97.  
  98.     procedure StandardGetFolder (where: Point; message: Str255; var mySFReply: StandardFileReply);
  99.         var
  100.             pb: CInfoPBRec;
  101.             isfolder, wasaliased: boolean;
  102.             oe: OSErr;
  103.             MyCustomGetDirectoryFileFilterProc: FileFilterYDUPP;
  104.             MyCustomGetDirectoryDlogHookProc: DlgHookYDUPP;
  105.     begin
  106.         gCurrentSelectedFolder := message;
  107.  
  108.         MyCustomGetDirectoryFileFilterProc := NewFileFilterYDProc(@MyCustomGetDirectoryFileFilter);
  109.         MyCustomGetDirectoryDlogHookProc := NewDlgHookYDProc(@MyCustomGetDirectoryDlogHook);
  110. {        CustomGetFile(MyCustomGetDirectoryFileFilterProc, -1, nil, mySFReply, rGetFolderDialog, where, MyCustomGetDirectoryDlogHookProc, nil, nil, nil, @mySFReply);}
  111.         CustomGetFile(MyCustomGetDirectoryFileFilterProc, -1, nil, mySFReply, rGetFolderDialog, where, MyCustomGetDirectoryDlogHookProc, nil, nil, nil, @mySFReply);
  112.         DisposeRoutineDescriptor(MyCustomGetDirectoryFileFilterProc);
  113.         DisposeRoutineDescriptor(MyCustomGetDirectoryDlogHookProc);
  114.  
  115.     {*-------------------------------------------------------------------------}
  116.     { Ok, now the reply record contains the volume reference number and the    }
  117.     { name of the selected folder. We need to use PBGetCatInfo to get the      }
  118.     { directory ID of the selected folder.                                     }
  119.     {-------------------------------------------------------------------------*}
  120.         if mySFReply.sfGood then begin { Don't call PBGetCatInfo on cancel! }
  121.  
  122.             if mySFReply.sfFile.name <> '' then begin { get the dirID of the selected folder }
  123.                 oe := ResolveAliasFile(mySFReply.sfFile, true, isfolder, wasaliased);
  124.                 if (oe = noErr) & not isfolder then begin
  125.                     oe := -1;
  126.                 end;
  127.                 if oe = noErr then begin
  128.                     oe := MyGetCatInfo (mySFReply.sfFile.vRefNum, mySFReply.sfFile.parID, mySFReply.sfFile.name, 0, pb);
  129.                 end;
  130.                 mySFReply.sfGood := oe = noErr;
  131.  
  132.                 mySFReply.sfFile.parID := pb.ioDrDirID;
  133.                 mySFReply.sfFile.name := '';
  134.             end;
  135.             if oe = noErr then begin { get the name of the selected folder }
  136.                 oe := MyGetCatInfo (mySFReply.sfFile.vRefNum, mySFReply.sfFile.parID, mySFReply.sfFile.name, -1, pb);
  137.             end;
  138.         end;
  139.  
  140.     end;
  141.  
  142. end.